from numpy import *
import operator

def createDataSet(): # 创建数据集和标签,具体数据集可替换，该数据为示例
    group = array([[0.1, 0.2], [0.2, 0.1], [0.4, 0.5], [0.5, 0.6]])
    labels = ['w1', 'w1', 'w2', 'w2']
    return group, labels

'''
    classify0()函数有四个输入参数，
    inX：待分类向量
    dataSet：输入的训练样本集
    labels：标签向量
    k：表示用于选择最近邻居数目
'''

def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]  # 返回训练样本集的行数
    diffMat = tile(inX, (dataSetSize, 1)) - dataSet   # 利用tile复制待分类向量行数使其与训练集个数相等，依次相减以矩阵形式保存
    sqDiffMat = diffMat**2  # 每个元素平方
    sqDistance = sqDiffMat.sum(axis=1)  # 按列相加得到待分类向量与训练样本每个向量的距离平方
    distances = sqDistance**0.5  # 开根号得欧式距离
    sortedDistIndicies = distances.argsort()  # 按行升序排列，返回下标值
    classCount = {}  # 初始化字典，以键值对形式按分类标签存储数量
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]  # 按距离由小到大循环输出分类标签
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1  # 以元组形式记录每种分类标签的个数，初始化为0
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
    # iteritems返回一个字典迭代器,operator.itemgetter获取对象的哪些维的数据，参数为一些序号，True表示为降序
    return sortedClassCount[0][0]  # 最终函数返回判断次数最多的类别名，即距离最短，可能性最大的类别
group, labels = createDataSet()
classCount = classify0([0.1,0.1], group, labels, 3)  # 这里按照参数要求调用classCount函数，数据集，测试向量，k值均可替换
print (classCount)